package factory

// ProductA 是产品接口
type ProductA interface {
	MakeA() string
}

// ProductB 是产品接口
type ProductB interface {
	MakeB() string
}

// Factory 是工厂接口
type Factory interface {
	CreateProductA() ProductA
	CreateProductB() ProductB
}

// ConcreteFactory1 是具体工厂1
type ConcreteFactory1 struct{}

// CreateProductA 方法创建产品A
func (factory *ConcreteFactory1) CreateProductA() ProductA {
	return &ProductA1{}
}

// CreateProductB 方法创建产品B
func (factory *ConcreteFactory1) CreateProductB() ProductB {
	return &ProductB1{}
}

// ConcreteFactory2 是具体工厂2
type ConcreteFactory2 struct{}

// CreateProductA 方法创建产品A
func (factory *ConcreteFactory2) CreateProductA() ProductA {
	return &ProductA2{}
}

// CreateProductB 方法创建产品B
func (factory *ConcreteFactory2) CreateProductB() ProductB {
	return &ProductB2{}
}

// ProductA1 是产品A1的实现
type ProductA1 struct{}

// MakeA 方法实现产品A的功能
func (product *ProductA1) MakeA() string {
	return "ProductA1 made."
}

// ProductB1 是产品B1的实现
type ProductB1 struct{}

// MakeB 方法实现产品B的功能
func (product *ProductB1) MakeB() string {
	return "ProductB1 made."
}

// ProductA2 是产品A2的实现
type ProductA2 struct{}

// MakeA 方法实现产品A的功能
func (product *ProductA2) MakeA() string {
	return "ProductA2 made."
}

// ProductB2 是产品B2的实现
type ProductB2 struct{}

// MakeB 方法实现产品B的功能
func (product *ProductB2) MakeB() string {
	return "ProductB2 made."
}
